home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 422_02 / dosutil / pcd.c < prev    next >
C/C++ Source or Header  |  1994-03-20  |  4KB  |  226 lines

  1. /*
  2.  * PC COUNTDOWN
  3.  *
  4.  * A simple "count down" timer with large numeric display.
  5.  *
  6.  * Copyright 1994 Dave Dunfield
  7.  * All rights reserved.
  8.  *
  9.  * Permission granted for personal (non-commercial) use only.
  10.  *
  11.  * Compile command: cc pcs -fop
  12.  */
  13. #include <stdio.h>
  14. #include <window.h>
  15.  
  16. #define    YOFFSET    3        /* Offset to display numbers from top of screen */
  17.  
  18. /* Font table for numeric character display */
  19. char numfont[10][7] = {
  20.     0x1C,    /* 00011100 */
  21.     0x22,    /* 00100010 */
  22.     0x45,    /* 01000101 */
  23.     0x49,    /* 01001001 */
  24.     0x51,    /* 01010001 */
  25.     0x22,    /* 00100010 */
  26.     0x1C,    /* 00011100 */
  27.  
  28.     0x08,    /* 00001000 */
  29.     0x18,    /* 00011000 */
  30.     0x38,    /* 00111000 */
  31.     0x08,    /* 00001000 */
  32.     0x08,    /* 00001000 */
  33.     0x08,    /* 00001000 */
  34.     0x3E,    /* 00111110 */
  35.  
  36.     0x1C,    /* 00011100 */
  37.     0x22,    /* 00100010 */
  38.     0x02,    /* 00000010 */
  39.     0x0C,    /* 00001100 */
  40.     0x10,    /* 00010000 */
  41.     0x20,    /* 00100000 */
  42.     0x3E,    /* 00111110 */
  43.  
  44.     0x1C,    /* 00011100 */
  45.     0x22,    /* 00100010 */
  46.     0x02,    /* 00000010 */
  47.     0x1C,    /* 00011100 */
  48.     0x02,    /* 00000010 */
  49.     0x22,    /* 00100010 */
  50.     0x1C,    /* 00011100 */
  51.  
  52.     0x04,    /* 00000100 */
  53.     0x0C,    /* 00001100 */
  54.     0x14,    /* 00010100 */
  55.     0x24,    /* 00100100 */
  56.     0x7E,    /* 01111110 */
  57.     0x04,    /* 00000100 */
  58.     0x04,    /* 00000100 */
  59.  
  60.     0x3E,    /* 00111110 */
  61.     0x20,    /* 00100000 */
  62.     0x3C,    /* 00111100 */
  63.     0x22,    /* 00100010 */
  64.     0x02,    /* 00000010 */
  65.     0x22,    /* 00100010 */
  66.     0x1C,    /* 00011100 */
  67.  
  68.     0x1C,    /* 00011100 */
  69.     0x22,    /* 00100010 */
  70.     0x20,    /* 00100000 */
  71.     0x3C,    /* 00111100 */
  72.     0x22,    /* 00100010 */
  73.     0x22,    /* 00100010 */
  74.     0x1C,    /* 00011100 */
  75.  
  76.     0x3E,    /* 00111110 */
  77.     0x02,    /* 00000010 */
  78.     0x04,    /* 00000100 */
  79.     0x08,    /* 00001000 */
  80.     0x10,    /* 00010000 */
  81.     0x20,    /* 00100000 */
  82.     0x20,    /* 00100000 */
  83.  
  84.     0x1C,    /* 00011100 */
  85.     0x22,    /* 00100010 */
  86.     0x22,    /* 00100010 */
  87.     0x1C,    /* 00011100 */
  88.     0x22,    /* 00100010 */
  89.     0x22,    /* 00100010 */
  90.     0x1C,    /* 00011100 */
  91.  
  92.     0x1C,    /* 00011100 */
  93.     0x22,    /* 00100010 */
  94.     0x22,    /* 00100010 */
  95.     0x1E,    /* 00011110 */
  96.     0x02,    /* 00000010 */
  97.     0x04,    /* 00000100 */
  98.     0x18 }    /* 00011000 */
  99.  
  100. /* Text for key prompt box */
  101. char keyprompt[] = {
  102. "Up/Down    - Adjust seconds\n\
  103. PgUp/PgDn  - Adjust 10's seconds\n\
  104. Home/End   - Adjust minites\n\
  105. Space      - Start/Stop\n\
  106. Escape     - Exit" };
  107.  
  108. int mattrs[3] = {        /* Monochrome attributes */
  109.     WSAVE|WCOPEN|WBOX2|NORMAL,
  110.     WCOPEN|WBOX1|REVERSE,
  111.     WSAVE|WBOX2|NORMAL };
  112.  
  113. int cattrs[3] = {        /* Color attributes */
  114.     WSAVE|WCOPEN|WBOX2|0x12,
  115.     WCOPEN|WBOX1|0x43,
  116.     WSAVE|WBOX2|0x17 };
  117.  
  118. int *attrs;                /* Pointer to current attributes */
  119.  
  120. main()
  121. {
  122.     int i;
  123.     static int seconds = 0;
  124.  
  125.     wopen(0, 0, 1, 1, 0);
  126.     wclose();
  127.     attrs = (W_BASE == 0xB000) ? mattrs : cattrs;
  128.  
  129.     wopen(0, 0, 80, 25, attrs[0]);
  130.     wgotoxy(6, 22);
  131.     putstr("PC COUNTDOWN - Copyright 1994 Dave Dunfield - All rights reserved.");
  132.     wcursor_off();
  133.     wgotoxy(38, YOFFSET+2); wputc(0xFE);
  134.     wgotoxy(38, YOFFSET+4); wputc(0xFE);
  135.  
  136.     wopen(20, 14, 40, 7, attrs[1]);
  137.     putstr(keyprompt);
  138.     wclose();
  139.  
  140.     W_OPEN->WINattr = attrs[2];
  141.  
  142.     for(;;) {
  143.         if(seconds < 0)
  144.             seconds = 0;
  145.         else if(seconds > ((99*60)+59))
  146.             seconds = (99 * 60) + 59;
  147.         display_number(seconds);
  148.         switch(wgetc()) {
  149.             case _KUA :
  150.                 ++seconds;
  151.                 continue;
  152.             case _KDA :
  153.                 --seconds;
  154.                 continue;
  155.             case _KPU :
  156.                 seconds += 10;
  157.                 continue;
  158.             case _KPD :
  159.                 seconds -= 10;
  160.                 continue;
  161.             case _KHO :
  162.                 seconds += 60;
  163.                 continue;
  164.             case _KEN :
  165.                 seconds -= 60;
  166.                 continue;
  167.             case ' ' :
  168.                 i = seconds;
  169.                 while(i && (wtstc() != ' ')) {
  170.                     delay(1000);
  171.                     display_number(--i); }
  172.                 if(i)
  173.                     continue;
  174.                 for(i=0; i < 10; ++i) {
  175.                     wputc(7);
  176.                     delay(100); }
  177.                 continue;
  178.             case 0x1B :
  179.                 wclose();
  180.                 return; } }
  181. }
  182.  
  183. /*
  184.  * Draw a number on the screen
  185.  */
  186. display_number(t)
  187.     unsigned t;
  188. {
  189.     unsigned s, m;
  190.  
  191.     m = t / 60;
  192.     s = t % 60;
  193.  
  194.     draw_digit(m / 10, 19);
  195.     draw_digit(m % 10, 28);
  196.     draw_digit(s / 10, 40);
  197.     draw_digit(s % 10, 49);
  198. }
  199.  
  200. /*
  201.  * Draw a single digit on the screen
  202.  */
  203. draw_digit(i, col)
  204.     unsigned i, col;
  205. {
  206.     int j, k;
  207.     char c;
  208.  
  209.     for(j=0; j < 7; ++j) {
  210.         wgotoxy(col, j+YOFFSET);
  211.         c = numfont[i][j];
  212.         for(k=0; k < 8; ++k) {
  213.             wputc((c & 0x80) ? i+'0' : ' ');
  214.             c <<= 1; } }
  215. }
  216.  
  217. /*
  218.  * Write a string to the screen
  219.  */
  220. putstr(ptr)
  221.     char *ptr;
  222. {
  223.     while(*ptr)
  224.         wputc(*ptr++);
  225. }
  226.